package Day014_Lambda表达式_Stream流.dem01_Lambda表达式.demo2_Lambda表达式概述;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author zhangyan
 * @date 2020/5/5 9:22
 */

/*
    不通过Runnable接口的实现类对象,直接将任务传递给线程对象
    特定情况下,简化代码,可以省略创建类,创建方法,创建对象的代码

    Lambda表达式格式: ()->{}
                    (参数类型 参数名称) -> { 执行代码语句 }
            格式说明：
                    小括号内的语法与传统方法(接口中的抽象方法)的参数列表一致：无参数则留空；多个参数则用逗号分隔
                    大括号内的语法与传统方法(实现接口中的抽象方法)的方法体一致
                    -> 是新引入的语法格式，代表指向动作

            省略规则:
                    在Lambda标准格式的基础上，使用省略写法的规则为：
                    1. 小括号内参数的类型可以省略；
                    2. 如果小括号内有且仅有一个参，则小括号可以省略；
                    3. 如果大括号内有且仅有一个语句，则无论是否有返回值，都可以省略大括号、return关键字及语句分号
 */

public class Test {
    public static void main(String[] args) {
        //1.线程案例
        //面向对象思想:匿名内部类
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程执行的代码1...");
            }
        });
        t1.start();

        //函数式编程思想: Lambda表达式
        Thread t2 = new Thread(()->{System.out.println("线程执行的代码2...");});
        t2.start();

        //2.比较器案例
        //面向对象思想:
        List<Integer> list = new ArrayList<>();
        /*list.add(100);
        list.add(200);
        list.add(500);
        list.add(300);
        list.add(400);*/
        Collections.addAll(list,100,200,500,400,300);
        System.out.println(list);
        //排序
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        System.out.println("排序后:" + list);

        //函数式编程思想: Lambda表达式
        Collections.sort(list,(Integer o1, Integer o2)->{return o1 - o2;});
        System.out.println("排序2后:" +list);
    }
}
